package model

import (
	"errors"
	"fmt"
	"github.com/spf13/viper"
	"os"
	"path"
	"strings"
)

func GetMachineRole(v *viper.Viper) (map[string][]string, error) {

	machineRoles := v.GetStringMapStringSlice("machineRole")
	if len(machineRoles) == 0 {
		return nil, errors.New("配置中未找到有效的 machineRole 节点或内容为空")
	}

	for role, ips := range machineRoles {
		if len(ips) == 0 {
			return nil, fmt.Errorf("角色 %s 的IP列表为空，请检查配置", role)
		}
	}

	return machineRoles, nil
}

// ParserConfig 解析指定路径的配置文件，返回viper实例和可能的错误
// 支持常见配置格式（yaml、yml、json等），错误由调用者处理（不再直接Exit）
func ParserConfig(configFile string) (*viper.Viper, error) {
	// 校验配置文件是否存在
	if _, err := os.Stat(configFile); err != nil {
		return nil, fmt.Errorf("配置文件不存在: %w", err)
	}

	// 初始化viper
	v := viper.New()

	v.SetConfigFile(configFile)

	// 自动检测配置文件类型（通过扩展名），若失败可手动指定默认类型
	if ext := path.Ext(configFile); ext != "" {
		configType := strings.TrimPrefix(ext, ".")
		v.SetConfigType(configType)
	} else {
		// 无扩展名时默认按yaml解析（根据你的场景调整，如json）
		v.SetConfigType("yaml")
	}

	// 读取配置文件（返回错误，由调用者决定是否退出或处理）
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("读取配置内容失败: %w", err)
	}

	return v, nil
}
func GetGlobalConfig(v *viper.Viper) (map[string]interface{}, error) {
	// 获取所有配置（包括 machineRole）
	allConfig := v.AllSettings()

	// 移除已单独处理的 machineRole 字段
	delete(allConfig, "machineRole")

	// 校验全局配置是否为空（可选，根据业务需求）
	if len(allConfig) == 0 {
		return nil, errors.New("配置文件中未找到有效的全局配置（除 machineRole 外）")
	}

	return allConfig, nil
}
